const axios = require('axios');
const fs = require('fs');
const path = require('path');
const { v4: uuidv4 } = require('uuid');
const { promisify } = require('util');
const writeFileAsync = promisify(fs.writeFile);
const unlinkAsync = promisify(fs.unlink);
const mkdirAsync = promisify(fs.mkdir);
const OSS = require('ali-oss');
const https = require('https');

// 自定义域名和OSS配置
const CUSTOM_DOMAIN = 'https://www.knomi.me';
const OSS_DOMAIN = 'https://knowmeh5.oss-ap-northeast-1.aliyuncs.com';
// 默认头像的路径（使用自定义域名）
const DEFAULT_AVATAR_URL = `${CUSTOM_DOMAIN}/usersImage/default-avatar.txt`;

// 代理配置
const USE_PROXY = process.env.USE_PROXY === 'true';
const PROXY_CONFIG = USE_PROXY ? {
  protocol: process.env.PROXY_PROTOCOL || 'http',
  host: process.env.PROXY_HOST || '127.0.0.1',
  port: parseInt(process.env.PROXY_PORT || '10792'),
} : null;

// 创建阿里云 OSS 客户端
const ossClient = new OSS({
  region: 'oss-ap-northeast-1',           // 地域：日本（东京）
  accessKeyId: 'LTAI5tNwqYAFseP5L9homYyf',       // AccessKey ID
  accessKeySecret: '467c2AVvztEcAKuT2oTAwJ4UjklmyT', // AccessKey Secret
  bucket: 'knowmeh5',                      // 存储空间名称
  endpoint: 'oss-ap-northeast-1.aliyuncs.com',  // 地域节点
  secure: true                             // 使用 HTTPS
});

// 创建临时上传目录
const uploadsDir = path.join(__dirname, '../../uploads');
if (!fs.existsSync(uploadsDir)) {
  fs.mkdirSync(uploadsDir, { recursive: true });
}

/**
 * 将OSS默认域名URL转换为自定义域名URL
 * @param {string} ossUrl - 阿里云OSS的URL
 * @returns {string} - 转换后的自定义域名URL
 */
function convertToCustomDomain(ossUrl) {
  if (!ossUrl) return DEFAULT_AVATAR_URL;
  return ossUrl.replace(OSS_DOMAIN, CUSTOM_DOMAIN);
}

/**
 * 从 URL 下载图片并保存到本地临时目录
 * @param {string} imageUrl - 图片 URL
 * @returns {Promise<string>} - 本地临时文件路径
 */
async function downloadImage(imageUrl) {
  try {
    // 创建自定义的HTTPS代理客户端，与谷歌API交互的配置保持一致
    const httpsAgent = new https.Agent({
      minVersion: "TLSv1.2",
      maxVersion: "TLSv1.3",
      rejectUnauthorized: true,
      timeout: 30000,
    });

    // 配置axios请求
    const requestConfig = { 
      responseType: 'arraybuffer',
      timeout: 30000,  // 增加到30秒
      maxRedirects: 5,
      httpsAgent: httpsAgent
    };

    // 如果启用了代理，添加代理配置
    if (USE_PROXY) {
      requestConfig.proxy = PROXY_CONFIG;
    }

    // 尝试使用与authController中相同的代理配置下载图片
    const response = await axios.get(imageUrl, requestConfig);
    
    const extension = path.extname(imageUrl).split('?')[0] || '.jpg';
    const filename = `${uuidv4()}${extension}`;
    const localPath = path.join(uploadsDir, filename);
    
    await writeFileAsync(localPath, response.data);
    // console.log(`图片成功下载到: ${localPath}`);
    return localPath;
  } catch (error) {
    console.error('下载图片失败:', error.message || error);
    // console.log('无法下载图片，使用默认头像。将返回默认头像URL');
    return DEFAULT_AVATAR_URL;
  }
}

/**
 * 将图片上传到阿里云 OSS
 * @param {string} localPath - 本地图片路径或默认头像URL
 * @returns {Promise<string>} - 自定义域名的图片 URL
 */
async function uploadToOSS(localPath) {
  // 如果传入的是默认头像URL，直接返回
  if (localPath === DEFAULT_AVATAR_URL) {
    return DEFAULT_AVATAR_URL;
  }
  
  try {
    const filename = path.basename(localPath);
    const ossPath = `usersImage/${filename}`; // 使用指定的文件夹
    
    // 上传文件到 OSS
    const result = await ossClient.put(ossPath, localPath);
    // console.log(`图片成功上传到OSS: ${result.url}`);
    
    // 清理临时文件
    await unlinkAsync(localPath);
    
    // 返回使用自定义域名的URL
    const customUrl = convertToCustomDomain(result.url);
    // console.log(`转换为自定义域名URL: ${customUrl}`);
    return customUrl;
  } catch (error) {
    console.error('上传图片到 OSS 失败:', error.message || error);
    
    // 如果上传失败，返回默认头像URL
    return DEFAULT_AVATAR_URL;
  }
}

/**
 * 处理图片 URL: 下载图片，上传到 OSS，并返回新的 URL
 * @param {string} imageUrl - 原始图片 URL
 * @returns {Promise<string>} - 自定义域名的图片 URL
 */
async function processImageUrl(imageUrl) {
  try {
    // console.log(`正在处理图片URL: ${imageUrl}`);
    
    // 跳过已经处理过的图片 URL（检查是否来自自定义域名）
    if (imageUrl && (
      imageUrl.includes('knowmeh5.oss-ap-northeast-1.aliyuncs.com') || 
      imageUrl.includes('www.knomi.me')
    )) {
    //   console.log('图片已经在OSS上，将转换为自定义域名格式');
      return convertToCustomDomain(imageUrl);
    }
    
    // 如果图片URL为空或无效，使用默认头像
    if (!imageUrl || typeof imageUrl !== 'string') {
    //   console.log('图片URL为空或无效，使用默认头像');
      return DEFAULT_AVATAR_URL;
    }
    
    const localPathOrDefaultUrl = await downloadImage(imageUrl);
    const ossUrl = await uploadToOSS(localPathOrDefaultUrl);
    return ossUrl;
  } catch (error) {
    console.error('处理图片 URL 失败:', error.message || error);
    // 如果处理失败，返回默认头像URL
    return DEFAULT_AVATAR_URL;
  }
}

module.exports = {
  downloadImage,
  uploadToOSS,
  processImageUrl
}; 